/*
 * 数据库连接实现文件
 */

//#include "../include/sqlite3.hpp"
#include "../include/postgresql.h"
#include "../include/sys_var.hpp"
#include <memory>

/*
 * 全局的数据库连接客户端启动对象。所有的数据库访问都使用这个作为句柄
 */
std::shared_ptr< CTRP_CRM_DB>  globe_db_conn( nullptr );

enum db_type{  SQLITE3 = 0,POSTGRESQL,__MYSQL__ ,SQL_SERVER  };

std::shared_ptr< CTRP_CRM_DB > GetOrCreateDBM(  )
{
    	if( globe_db_conn ) return globe_db_conn;
	//获取变量设置全局句柄
	std::shared_ptr< CSysVar >  pt_var = GetOrCreateSysVar(  );
	if( pt_var ){
		//读取数据库设置
		std::string add , usr, passwd , db;
		int port, db_type;
		//读取设置的变量
		pt_var->GetValue( "/db/dbname" , db_type );
		pt_var->GetValue( "/db/add", add );
		pt_var->GetValue( "/db/port" , port );
		pt_var->GetValue( "/db/user" , usr );
		pt_var->GetValue( "/db/passwd" , passwd );
		pt_var->GetValue( "/db/db" , db );
		//数据库连接和初始化
		switch( db_type ){
		case SQLITE3:
			// TODO (Administrator#1#): 后续空闲时间可以逐步加入mysql,和SQLITE3的支持，以及Sql server的支持
			//globe_db_conn = std::shared_ptr<CTRP_CRM_DB>( new CSqlite3( add ) );
			globe_db_conn = std::shared_ptr<CTRP_CRM_DB>(nullptr);
			break;

		case __MYSQL__:
			globe_db_conn = std::shared_ptr<CTRP_CRM_DB>(nullptr);
			// std::shared_ptr<CTRP_CRM_DB>( new CltrpBase( add ,  usr ,  passwd,  db,  port)  );
			break;

		case POSTGRESQL:
			globe_db_conn = std::shared_ptr<CTRP_CRM_DB>(new CPostgreSQL( add , port , usr, passwd, db) );
			break;
		case SQL_SERVER:
			globe_db_conn = std::shared_ptr<CTRP_CRM_DB>(nullptr);
			break;
		default:
			globe_db_conn = std::shared_ptr<CTRP_CRM_DB>(nullptr);
			break;
		}

	}

	if( globe_db_conn && !globe_db_conn->is_connect(  ) )
		globe_db_conn.reset( );

	return globe_db_conn;
}

void CloseDB()
{
    	globe_db_conn.reset();
}

std::shared_ptr<CTRP_CRM_DB>
GetOrCreateDBM( const std::string& add )
{
	//TODO ,添加实现代码
	return globe_db_conn;
}

std::shared_ptr<CTRP_CRM_DB>
GetOrCreateDBM( const std::string& add ,
                int port ,
                const std::string& usr ,
                const std::string& passwd ,
                const std::string& db )
{
	//添加实现代码
	return globe_db_conn;
}


